package com.yc.tomcat.core;

import java.io.File;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ParseUrlPattern {
	// 以url地址为键，对应的处理类为值
	private static Map<String, String> urlPattren = new Hashtable<String, String>();

	public ParseUrlPattern() {
		parse();
		urlPattren.forEach((key, val) -> {
			System.out.println(key + ":" + val);
		});
	}

	/**
	 * 解析
	 */
	private void parse() {
		File[] files = new File(ContantInfo.BASE_PATH).listFiles();
		
		if (files == null || files.length <= 0) {  // 说明服务器里面没有部署项目
			return;
		}
		
		String projectName = null;
		File webFile = null;
		
		// 循环所有目录，这个目录的名字就是我们的项目名
		for (File fl : files) {
			if (!fl.isDirectory()) {   // 如果当前文件不是一个目录，则不管
				continue;
			}
			
			webFile = new File(fl, "WEB-INF/web.xml");   // 从父抽象路径名和子路径名字符串创建新的 File实例
			if (!webFile.exists()) {   // 说明这项目里面没有配置web.xml文件
				continue;
			}
			
			projectName = fl.getName();  // 项目名即为这个文件夹的名字
			parseXml(projectName, webFile);
		}
		
	}

	/**
	 * 解析web.xml文件
	 * @param projectName
	 * @param webFile
	 */
	@SuppressWarnings("unchecked")
	private void parseXml(String projectName, File webFile) {
		SAXReader reader = new SAXReader();
		Document doc = null;
		
		try {
			doc = reader.read(webFile);
			List<Element> servletList = doc.selectNodes("//servlet");
			// 说明没有配置servlet
			if (servletList == null || servletList.isEmpty()) {
				return;
			}
			
			String url = null;
			for (Element el : servletList) {
				url = el.selectSingleNode("url-pattren").getText().trim();
				if (!url.startsWith("/")) {
					url = "/" + url;
				}
				urlPattren.put("/" + projectName + url, el.selectSingleNode("servlet-class").getText().trim());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

	public static String getServletClass(String url) {
		return urlPattren.get(url);
	}
	
}
